// 复习:理解滑动窗口以及Set集合
/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function (s) {
  let maxNum = 0;
  // Set集合，记录最长不重复字符
  const occ = new Set();
  // 定义右侧指针；-1表示在最左边还没开始移动
  let r = -1;
  for (let i = 0; i < s.length; i++) {
    // 每循环一次就相当于左指针i往右移动一次，移动一次就将左指针左侧的字符剔除；类似于滑动窗口的效果
    if (i != 0) {
      occ.delete(s.charAt(i - 1));
    }
    // 右指针开始移动
    // occ中不会重复，判断下一个字符是否在这个集合中；一旦有重复此次循环就结束
    while (r + 1 < s.length && !occ.has(s.charAt(r + 1))) {
      occ.add(s.charAt(r + 1));
      r++;
    }
    // occ中的字符长度与与左右指针当前距离长度
    maxNum = Math.max(maxNum, r - i + 1);
  }
  return maxNum;
};

const s = "bbbbbbbbbbbb";
let demo = lengthOfLongestSubstring(s);
console.log(demo);
